home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / PACOMAN.PRG < prev    next >
Encoding:
Text File  |  1997-11-28  |  29.9 KB  |  863 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. //TITULO:      PACOMAN
  4. //AUTOR:       DANIEL NAVARRO
  5. //FECHA:       01/01/96
  6. //------------------------------------------------------------------------------
  7.  
  8. PROGRAM pacoman;
  9.  
  10. GLOBAL
  11.  
  12.     // Tabla con el tiempo que dura el efecto de poder comer
  13.     tiempo_capsulas[]=0,300,240,180,140,120,100,80,60,40,0;
  14.  
  15.     // Tabla de dificultad
  16.     inteligencia[]=0,10,30,50,65,75,85,90,95,100,100;
  17.  
  18.     // Tabla con la puntuación de las frutas
  19.     valor_frutas[]=0,100,300,500,500,700,700,1000,1000,2000,2000;
  20.  
  21.     // Tabla con los gráficos de la puntuación de la fruta
  22.     g_valor_frutas[]=0,54,55,56,56,57,57,58,58,59,59;
  23.  
  24.     // Tabla con los gráficos de la fruta
  25.     g_frutas[]=0,48,49,50,50,51,51,52,52,53,53;
  26.  
  27.     puntuacion_antigua=0;   // Indicador de la ultima puntuación
  28.     puntuacion=0;           // Puntuación del jugador
  29.     nivel;                  // Nivel actual
  30.     puntos=0;               // Puntos comidos (cocos)
  31.  
  32.     vidas[10];              // Identificadores para las vidas del marcador
  33.     ividas=0;               // Contador de vidas en el marcador
  34.     puntuacion_max=10000;   // Máxima puntuación por defecto
  35.     idpaco;                 // Identificador para pacoman
  36.  
  37.     s_inicio;               // Identificadores de sonido
  38.     s_come_fantasma;
  39.     s_come_fruta;
  40.     s_come_punto;
  41.     s_come_puntogr;
  42.     s_empieza;
  43.     s_muerte;
  44.     canal_s_inicio;         // Identificador para el canal del sonido s_inicio
  45.  
  46.  
  47. LOCAL
  48.     estado=0;               // Estado de fantasma (0=normal >0 Contador de modo pánico
  49.     modelo;                 // Tipo de gráfico de fantasma
  50.  
  51. BEGIN
  52.     set_mode(m640x480);     // Selecciona modo de vídeo
  53.  
  54.     // Carga sonidos
  55.     s_come_fantasma=load_pcm("pacoman\comefant.pcm",0);
  56.     s_come_fruta=load_pcm("pacoman\comefrut.pcm",0);
  57.     s_come_punto=load_pcm("pacoman\comecoco.pcm",0);
  58.     s_come_puntogr=load_pcm("pacoman\comegcoc.pcm",0);
  59.     s_empieza=load_pcm("pacoman\comienzo.pcm",0);
  60.     s_muerte=load_pcm("pacoman\muerto.pcm",0);
  61.     s_inicio=load_pcm("pacoman\tambor2.pcm",1);
  62.  
  63.     // Carga la ultima máxima puntuación
  64.     load("dat\pacoman\pacoman.dat",&puntuacion_max);
  65.  
  66.     // Define la región 1 que será la que se use como de impresión
  67.     define_region(1,105,0,640-209,480);
  68.  
  69.     load_pal("pacoman\pacoman.fpg");     // Carga gráficos
  70.     load_fpg("pacoman\pacoman.fpg");
  71.     load_fnt("pacoman\pacoman.fnt");     // Carga fuentes
  72.  
  73.     parpadeante(128,56);  // Pone los puntos grandes
  74.     parpadeante(512,56);
  75.     parpadeante(128,364);
  76.     parpadeante(512,364);
  77.  
  78.     // Pone la pantalla de inicio
  79.  
  80.     WHILE (NOT (key(_esc)))
  81.  
  82.         // Ejecuta sonido
  83.         canal_s_inicio=sound(s_inicio,512,256);
  84.  
  85.         nivel=1;    // Primer nivel
  86.  
  87.         // Imprime pantalla de fondo
  88.         xput(0,1,320,240,0,100,4,0);
  89.         // Pone textos explicativos
  90.         titulo(write(1,320,320,1,"Pulsa una tecla para jugar"));
  91.         write(1,320,80,1,"Record");
  92.         write_int(1,320,110,1,&puntuacion_max);
  93.         write(1,320,430,1,"(c) 96 Daniel Navarro - DIV Game Studio");
  94.  
  95.         fantasma(320,177,12);       // Crea un fantasma
  96.         son.flags=son.flags OR 4;   // Lo hace transparente
  97.         fantasma(290,223,16);       // Crea otro fantasma
  98.         son.flags=son.flags OR 4;   // Lo hace transparente
  99.         fantasma(320,223,20);       // Crea otro fantasma
  100.         son.flags=son.flags OR 4;   // Lo hace transparente
  101.         fantasma(352,223,24);       // Crea otro fantasma
  102.         son.flags=son.flags OR 4;   // Lo hace transparente
  103.  
  104.         fade_on();  // Enciende la pantalla
  105.  
  106.         // Espera a que se pulse una tecla
  107.         WHILE (scan_code==0)
  108.             FRAME;
  109.         END
  110.  
  111.         IF (key(_esc))      // Sale del programa cuando se pulsa escape
  112.             fade_off();
  113.             exit("Gracias por jugar!",0);
  114.         END
  115.  
  116.         // Detiene el sonido inicial del menu
  117.         stop_sound(canal_s_inicio);
  118.  
  119.         // Apaga la pantalla
  120.         fade_off();
  121.         let_me_alone();         // Elimina todos los procesos que hubiera
  122.         delete_text(all_text);  // Elimina también todos los textos
  123.  
  124.         parpadeante(128,56);    // Crea los puntos gordos
  125.         parpadeante(512,56);
  126.         parpadeante(128,364);
  127.         parpadeante(512,364);
  128.  
  129.         clear_screen();         // Borra la pantalla
  130.         put(0,1,320,240);       // Y pone el fondo nuevo
  131.         // Pone los dos logos de los laterales
  132.         xput(0,47,56,260,pi/2,100,0,0);
  133.         xput(0,47,585,260,-pi/2,100,0,0);
  134.         // Escribe la puntuación
  135.         write_int(1,100,0,2,&puntuacion);
  136.         // Crea los procesos que contabilizan las vidas
  137.         ividas=0;
  138.         vidas[ividas]=vida((ividas*26)+552);
  139.         ividas++;
  140.         vidas[ividas]=vida((ividas*26)+552);
  141.         ividas++;
  142.         // Reinicializa el número de puntos comidos y la puntuación
  143.         puntos=0;
  144.         puntuacion=0;
  145.         // Llama a un proceso que reinicia el juego
  146.         inicio_juego();
  147.  
  148.         // Empieza el juego
  149.         // Repite hasta queno tenga vidas o se pulse la tecla escape
  150.         WHILE (ividas>=0 AND NOT key(_esc))
  151.  
  152.             IF (puntos==246)        // Siguiente nivel
  153.                 nivel++;            // Incremente el nivel (fase)
  154.                 nivel=nivel MOD 11; // Solo Niveles de 1 a 10
  155.                 fade_off();         // Apaga la pantalla
  156.                 let_me_alone();     // Borra todos los procesos que hubiera
  157.                 // Crea otros 4 nuevos puntos parpadeantes
  158.                 parpadeante(128,56);
  159.                 parpadeante(512,56);
  160.                 parpadeante(128,364);
  161.                 parpadeante(512,364);
  162.                 // Pone otro fondo de pantalla
  163.                 put(0,1,320,240);
  164.                 // Reinicia el número de puntos comidos y llama a un proceso que reinicia el juego
  165.                 puntos=0;
  166.                 inicio_juego();
  167.             END
  168.  
  169.             // Pone las frutas cada vez se comen 100 o 200 puntos (cocos)
  170.             IF (puntos==100 OR puntos==200)
  171.                 fruta();
  172.                 puntos++;
  173.             END
  174.  
  175.             // Da una vida a los 10000 puntos
  176.             IF (puntuacion>=10000 AND puntuacion_antigua<10000)
  177.                 vidas[ividas]=vida(ividas*26+552);
  178.                 ++ividas;
  179.             END
  180.  
  181.             // Da otra vida a los 50000 puntos
  182.             IF (puntuacion>=50000 AND puntuacion_antigua<50000)
  183.                 vidas[ividas]=vida(ividas*26+552);
  184.                 ++ividas;
  185.             END
  186.             // Actualiza puntuación antigua, necesaria para dar vidas solo una vez
  187.             puntuacion_antigua=puntuacion;
  188.  
  189.             FRAME;
  190.         END
  191.         let_me_alone(); // Elimina todos los procesos que hubiera
  192.  
  193.         // Juego nuevo
  194.         write(1,320,197,1,"Fin del juego");
  195.         FRAME(4000);            // Espera un poco en la última imagen
  196.         fade_off();             // Apaga la pantalla
  197.         delete_text(all_text);  // Borra todos los textos que hubiera
  198.         clear_screen();         // Borra la pantalla
  199.  
  200.         // Nueva máxima puntuación
  201.         IF (puntuacion>puntuacion_max)
  202.             puntuacion_max=puntuacion;  // Cambia la variable que guarda el valor de maxima puntuación
  203.             // Y graba la maxima puntuación en disco
  204.             save("dat\pacoman\pacoman.dat",&puntuacion_max,1);
  205.         END
  206.     END
  207. END
  208.  
  209. //------------------------------------------------------------------------------
  210. // Proceso paco
  211. // Maneja a pacoman
  212. //------------------------------------------------------------------------------
  213.  
  214. PROCESS paco()
  215.  
  216. PRIVATE
  217.     imagen;             // Contador de imágenes
  218.     velocidad_paco=2;   // Velocidad de pacoman
  219.     incr_x=0;           // Coordenadas relativas
  220.     incr_y=0;
  221.     contador0;          // Contador general
  222.     comido;             // Identificador de fantasma
  223.     grafico_viejo;      // Contenedor temporal de gráficos
  224.     pasos[]=0,1,2,1;    // Tabla de animación
  225.     paso=0;             // Contador de animación
  226.     grafico_inicial=3;  // Gráfico inicial
  227.     puntos_por_comido=200;  // Contador de fantasmas comidos
  228.  
  229. BEGIN
  230.     idpaco=id;          // Coge el identificador del proceso
  231.     region=1;           // Hace que el proceso aparezca dentro de la región 1
  232.     graph=3;            // Asigna el gráfico y las coordenadas
  233.     x=320;
  234.     y=364;
  235.     LOOP
  236.         // Lee teclas
  237.         IF (key(_space))    // Cambia velocidad si se pulsa la barra espaciadora
  238.             velocidad_paco=4;
  239.         ELSE
  240.             velocidad_paco=2;
  241.         END
  242.  
  243.         // Comprueba si se pulso el cursor de la derecha y puede ir en esa dirección
  244.         IF (key(_right) AND camino_paco(x+2,y))
  245.             grafico_inicial=3;  // Elige el gráfico inicial
  246.             flags=0;
  247.             incr_x=2;           // Pone los incrementos vertical y horizontal
  248.             incr_y=0;
  249.         END
  250.  
  251.         // Comprueba si se pulso el cursor de la izquierda y puede moverse en esa dirección
  252.         IF (key(_left) AND camino_paco(x-2,y))
  253.             grafico_inicial=3;
  254.             flags=1;
  255.             incr_x=-2;
  256.             incr_y=0;
  257.         END
  258.  
  259.         // Comprueba si se pulso el cursor de abajo y puede avanzar
  260.         IF (key(_down) AND camino_paco(x,y+2))
  261.             grafico_inicial=6;
  262.             flags=0;
  263.             incr_y=2;
  264.             incr_x=0;
  265.         END
  266.  
  267.         // Comprueba si se pulso el cursor de arriba y puede avanzar
  268.         IF (key(_up) AND camino_paco(x,y-2))
  269.             grafico_inicial=6;
  270.             flags=2;
  271.             incr_y=-2;
  272.             incr_x=0;
  273.         END
  274.  
  275.         // Comprueba caminos en la dirección horizontal
  276.         IF (camino_paco(x+incr_x,y))
  277.             x+=incr_x;  // Si se pude mover se mueve
  278.         ELSE
  279.             incr_x=0;   // Detiene el movimiento
  280.             paso=1;     // Y reinicia la animación
  281.         END
  282.  
  283.         // Comprueba caminos en la dirección horizontal
  284.         IF (camino_paco(x,y+incr_y))
  285.             y+=incr_y;  // Si se pude mover se mueve
  286.         ELSE
  287.             incr_y=0;   // Detiene el movimiento
  288.             paso=1;     // Y reinicia la animación
  289.         END
  290.  
  291.         // Selecciona gráficos
  292.         graph=grafico_inicial+pasos[paso];
  293.  
  294.         // Unicamente muestra la pantalla a la velocidad de paco
  295.         IF (imagen>=velocidad_paco)
  296.             FRAME;  // Muestra los gráficos
  297.             imagen=0;
  298.             // Comprueba si ha colisionado con un fantasma
  299.             IF (comido=collision(TYPE fantasma))
  300.  
  301.                 // Mira si realmente el fantasma esta cerca
  302.                 IF (abs(x-comido.x)>10 OR abs(y-comido.y)>10)
  303.                     comido=0;   // Hace como si no se hubieran tocado
  304.                 END
  305.  
  306.             END
  307.             // Actualiza la animación del gráfico
  308.             IF (incr_x<>0 OR incr_y<>0)
  309.                 paso=(paso+1) MOD 4;
  310.             END
  311.         END
  312.         imagen++;   // Incrementa el contador de imagenes
  313.  
  314.         // Verifica si pacoman ha salido por los lados
  315.         IF (x<=95)
  316.             x+=450; // Hace que aparezca por el otro lado
  317.         END
  318.  
  319.         IF (x>=546)
  320.             x-=450;
  321.         END
  322.  
  323.         // Pacoman ha comido un punto
  324.         IF (punto(x,y)==14)
  325.             puntos++;       // Incrementa el contador de puntos comidos
  326.             puntuacion+=10; // Incrementa la puntuación
  327.             put(0,9,x,y);   // Borra el punto del mapa de durezas
  328.             imagen++;       // Incrementa el contador imagenes
  329.             sound(s_come_punto,128,256);    // Hace el sonido
  330.         END
  331.  
  332.         // Pacoman ha comido un punto grande
  333.         IF (punto(x,y)==10)
  334.             sound(s_come_puntogr,512,256);  // Realiza el sonido
  335.             puntos++;                       // Incrementa el número de puntos comidos
  336.             puntuacion+=50;                 // Incrementa la puntuación
  337.             puntos_por_comido=0;            // Reinicia la variable que guarda
  338.                                             // los puntos que se dan cuando se come a un fantasma
  339.             put(0,10,x,y);                  // Quita el punto del mapa de durezas
  340.  
  341.             // Pone a todos los fantasmas en estado de ser comidos
  342.             WHILE (contador0=get_id(TYPE fantasma))
  343.                 contador0.estado=tiempo_capsulas[nivel];
  344.             END
  345.         END
  346.  
  347.         // Comprueba si ha tocado un fantasma
  348.         IF (comido)
  349.             IF (comido.estado>0)      // Pacoman se come al fantasma
  350.                 sound(s_come_fantasma,512,256);         // Hace el sonido
  351.  
  352.                 // Congela a todos los fantasmas
  353.                 WHILE (contador0=get_id(TYPE fantasma))
  354.                     signal(contador0,s_freeze);
  355.                 END
  356.  
  357.                 grafico_viejo=graph;                    // Guarda el gráfico que tenia
  358.                 graph=0;                                // Quita el gráfico
  359.                 comido.graph=42+puntos_por_comido;      // Cambia el gráfico del fantasma
  360.                                                         // por el de la puntuación obtenida
  361.                 FRAME(1500);                            // Espera a que se den 15 imagenes
  362.  
  363.                 // Vuelve a todos los fantasma al estado en que estaban
  364.                 WHILE (contador0=get_id(TYPE fantasma))
  365.                     signal(contador0,s_wakeup);
  366.                 END
  367.                 graph=grafico_viejo;                    // Recupera el gráfico de paco
  368.                 ojos(comido.x,comido.y,comido.modelo);  // Crea unos ojos de fantasma
  369.                 signal(comido,s_kill);                  // Elimina el fantasma comido
  370.                 SWITCH (puntos_por_comido);             // Da la puntuación según los fantasmas comidos
  371.                     CASE 0: puntuacion+=200; END
  372.                     CASE 1: puntuacion+=400; END
  373.                     CASE 2: puntuacion+=800; END
  374.                     CASE 3: puntuacion+=1600; END
  375.                     CASE 4: puntuacion+=3200; END
  376.                 END
  377.                 puntos_por_comido++;                    // Incrementa para la proxima vez que coma
  378.             ELSE                    // Fantasma se come a pacoman
  379.  
  380.                 // Congela los procesos de todos los fantasmas
  381.                 WHILE (contador0=get_id(TYPE fantasma))
  382.                     signal(contador0,s_freeze);
  383.                 END
  384.                 FRAME(1500);        // Espera a que se den 15 imagenes
  385.  
  386.                 // Elimina los procesos de fantasmas, ojos y frutas
  387.                 signal(TYPE fantasma,s_kill);
  388.                 signal(TYPE ojos,s_kill);
  389.                 signal(TYPE fruta,s_kill);
  390.                 flags=0;                    // Coloca el gráfico sin ningun espejado
  391.                 sound(s_muerte,512,256);    // Realiza el sonido
  392.                 FROM contador0=34 TO 41;    // Hace la animación de ser comido
  393.                     graph=contador0;
  394.                     FRAME(400);
  395.                 END
  396.                 FRAME(800);                 // Espera 8 imagenes de pantalla
  397.                 IF (ividas<>0)      // Comprueba si le quedan vidas
  398.                     signal(vidas[ividas],s_kill);
  399.                     ividas--;       // Quita una vida
  400.                     inicio_juego(); // Reinicia el juego
  401.                 ELSE
  402.                     ividas--;       // Final del juego
  403.                 END
  404.                 signal(id,s_kill);
  405.                 FRAME;
  406.             END
  407.             comido=0;               // Borra cualquier colisión detectada que hubiera
  408.         END
  409.     END
  410. END
  411.  
  412. //------------------------------------------------------------------------------
  413. // Proceso camino_paco
  414. // Controla por donde puede ir  pacoman
  415. //------------------------------------------------------------------------------
  416.  
  417. PROCESS camino_paco(x,y)
  418.  
  419. PRIVATE
  420.     numero_color;   // Número de color en el mapa de durezas
  421.  
  422. BEGIN
  423.     numero_color=color(x,y);     // Coge el color del mapa de durezas
  424.     RETURN(numero_color==10 OR
  425.            numero_color==12 OR
  426.            numero_color==14);    // Retorna TRUE si puede avanzar
  427. END
  428.  
  429. //------------------------------------------------------------------------------
  430. // Proceso punto
  431. // Coge un color del mapa de durezas
  432. //------------------------------------------------------------------------------
  433.  
  434. PROCESS punto(x,y)
  435.  
  436. BEGIN
  437.     IF (get_pixel(x,y)==16) // Comprueba que el color no sea incorrecto
  438.         RETURN(0);          // Devuelve FALSE (= 0 = falso) porque ese color es valido
  439.     ELSE
  440.         RETURN(color(x,y)); // Retorna el código de color
  441.     END
  442. END
  443.  
  444. //------------------------------------------------------------------------------
  445. // Proceso camino_fantasma
  446. // Controla por donde ira el fantasma
  447. //------------------------------------------------------------------------------
  448.  
  449. PROCESS camino_fantasma(x,y,dir)
  450.  
  451. PRIVATE
  452.     n_color;  // Color 10=Punto grande 11=Casa de fantasma 12=Camino 14=Punto
  453.  
  454. BEGIN
  455.     // Comprueba la dirección
  456.     SWITCH (dir)
  457.         CASE 0: n_color=color(x-2,y); END
  458.         CASE 1: n_color=color(x+2,y); END
  459.         CASE 2: n_color=color(x,y+2); END
  460.         CASE 3: n_color=color(x,y-2); END
  461.     END
  462.  
  463.     // El fantasma no vuelve a entrar en su casa
  464.     IF (n_color==11 AND dir==2 AND color(x,y)==12)
  465.         n_color=0;
  466.     END
  467.  
  468.     // Retorna verdadero (TRUE) si es un camino correcto
  469.     RETURN(n_color==11 OR n_color==10 OR n_color==12 OR n_color==14);
  470. END
  471.  
  472. //------------------------------------------------------------------------------
  473. // Proceso color
  474. // Coge un color del mapa de durezas
  475. //------------------------------------------------------------------------------
  476.  
  477. PROCESS color(x,y)
  478.  
  479. BEGIN
  480.     // Comprueba si son los lados de la pantalla
  481.     IF ((x<105 OR x>534) AND (y==225 OR y==226))
  482.         RETURN(12); // Devuelve un color de camino
  483.     END
  484.  
  485.     // Devuelve el color del mapa de durezas
  486.     RETURN(map_get_pixel(0,2,(x-105)/2,(y-1)/2));
  487. END
  488.  
  489. //------------------------------------------------------------------------------
  490. // Proceso fantasma
  491. // Maneja al fantasma
  492. //------------------------------------------------------------------------------
  493.  
  494. PROCESS fantasma(x,y,modelo)
  495.  
  496. PRIVATE
  497.     imagen;         // Contador de gráficos
  498.     num_imagenes;   // Número de imagenes en que da en pantalla
  499.     dir=3;          // Dirección 0=izq. 1=der. 2=abajo 3=arriba
  500.  
  501. BEGIN
  502.     region=1;       // Lo introduce dentro de la región definida
  503.  
  504.     LOOP
  505.         // Si el fantasma esta en casa entonces da más imagenes
  506.         IF (color(x,y)==11 OR estado>0)
  507.             num_imagenes=1;
  508.         ELSE
  509.             num_imagenes=2;
  510.         END
  511.  
  512.         // Si el fantasma esta en un cruce selecciona un camino
  513.         IF (cuenta_dir(x,y)>2)
  514.             dir=selecciona_dir(x,y,dir); // Devuelve una dirección correcta
  515.         ELSE
  516.             // Si no tiene ningún camino por donde avanza
  517.             IF (NOT camino_fantasma(x,y,dir))
  518.                 dir=selecciona_dir(x,y,dir);    // Elige otro camino
  519.             END
  520.  
  521.             // Aleatoriamente cambia la dirección si se puede
  522.             IF (rand(0,1000)<2)
  523.                 dir=selecciona_dir(x,y,dir XOR 1);
  524.             END
  525.         END
  526.  
  527.         SWITCH (dir)    // Mueve al fantasma
  528.             CASE 0: x-=2; END
  529.             CASE 1: x+=2; END
  530.             CASE 2: y+=2; END
  531.             CASE 3: y-=2; END
  532.         END
  533.  
  534.         // Comprueba si se sale por los lados de la pantalla
  535.         IF (x<=95) x+=450; END
  536.         IF (x>=546) x-=450; END
  537.  
  538.         // Comprueba el estado del fantasma
  539.         IF (estado==0)
  540.             graph=modelo+dir;   // Elige un gráfico de la dirección en estado normal
  541.         ELSE
  542.             // El fantasma puede ser comido y parpadea cambiando gráficos
  543.             IF (estado<70 AND estado/7)
  544.                 graph=28;
  545.             ELSE
  546.                 graph=11;
  547.             END
  548.             estado--;           // Decrementa el contador de estado del fantasma
  549.         END
  550.  
  551.         // Unicamente muestra la imagen a la velocidad del fantasma
  552.         IF (imagen>=num_imagenes)
  553.             FRAME;
  554.             imagen=0;
  555.         END
  556.         imagen++;               // Incrementa el contador de imagenes
  557.     END
  558. END
  559.  
  560. //------------------------------------------------------------------------------
  561. // Proceso selecciona_dir
  562. // Controla por donde ira el fantasma
  563. //------------------------------------------------------------------------------
  564.  
  565. PROCESS selecciona_dir(x,y,old_dir)
  566.  
  567. PRIVATE
  568.   dir[3];       // Tabla de posibles direcciones
  569.   num_dir=0;    // Numero de direcciones
  570.   contador0=0;  // Contador general
  571.   dir1;         // Direcciones temporales
  572.   dir2;
  573.  
  574. BEGIN
  575.  
  576.     // Contando direcciones
  577.     FROM contador0=0 TO 3;
  578.         // Comprueba si se puede avanzar en la dirección de contador0
  579.         IF (camino_fantasma(x,y,contador0) AND old_dir<>(contador0 XOR 1))
  580.             dir[num_dir]=contador0; // Si se puede se guarda
  581.             num_dir++;              // Y se incrementa el contador de direcciones posibles
  582.         END
  583.     END
  584.  
  585.     // Cambia la dirección si no hay ninguna otra
  586.     IF (num_dir==0)
  587.         dir[num_dir]=old_dir XOR 1;
  588.         num_dir++;
  589.     END
  590.  
  591.     // Selecciona la dirección de acuerdo con el nivel
  592.     contador0=dir[rand(0,num_dir-1)];
  593.     // Aleatoriamente y según el nivel elige una dirección u otra
  594.     IF (rand(0,100)<inteligencia[nivel])
  595.         IF (father.estado==0) // Mira en que estado estaba el fantasma
  596.             IF (idpaco)       // Comprueba si paco existe
  597.                 // Es el estado de poder comer y va hacia paco
  598.                 // Mira que distancia es menor, la horizontal o la vertical
  599.                 IF (abs(idpaco.x-father.x)>abs(idpaco.y-father.y))
  600.                     // Mira si a la derecha o a la izquierda
  601.                     IF (idpaco.x>father.x)
  602.                         dir1=1; // Guarda la primera dirección posible
  603.                     ELSE
  604.                         dir1=0;
  605.                     END
  606.                     IF (idpaco.y>father.y)
  607.                         dir2=2; // Guarda una segunda dirección posible
  608.                     ELSE
  609.                         dir2=3;
  610.                     END
  611.                 ELSE            // La diferencia vertical es mayor
  612.                     IF (idpaco.y>father.y)
  613.                         dir1=2; // Guarda la primera dirección posible
  614.                     ELSE
  615.                         dir1=3;
  616.                     END
  617.                     IF (idpaco.x>father.x)
  618.                         dir2=1; // Guarda una segunda dirección posible
  619.                     ELSE
  620.                         dir2=0;
  621.                     END
  622.                 END
  623.             END
  624.         ELSE
  625.             // Es el estado de ser comido, se aleja de paco
  626.             // Se comprueba que diferencia es mayor, la horizontal o la vertical
  627.             IF (abs(idpaco.x-father.x)<abs(idpaco.y-father.y))
  628.                 // Y comprueba si es a la izquierda o a la derecha
  629.                 IF (idpaco.x>father.x)
  630.                     dir1=0;     // Guarda la primera dirección posible
  631.                 ELSE
  632.                     dir1=1;
  633.                 END
  634.                 IF (idpaco.y>father.y)
  635.                     dir2=3;     // Guarda una segunda dirección posible
  636.                 ELSE
  637.                     dir2=2;
  638.                 END
  639.             ELSE
  640.                 // Mira si hacia arriba o hacia abajo
  641.                 IF (idpaco.y>father.y)
  642.                     dir1=3;    // Guarda la primera dirección posible
  643.                 ELSE
  644.                     dir1=2;
  645.                 END
  646.                 IF (idpaco.x>father.x)
  647.                     dir2=0;    // Guarda una segunda dirección posible
  648.                 ELSE
  649.                     dir2=1;
  650.                 END
  651.             END
  652.         END
  653.  
  654.         // Si se puede avanzar en la primera dirección posible, la devuelve
  655.         IF (old_dir==dir1 AND camino_fantasma(x,y,dir1))
  656.             RETURN(dir1);
  657.         ELSE    // Si no, si se puede avanzar, devuelve la segunda posible dirección
  658.             IF (NOT camino_fantasma(x,y,dir1) AND old_dir==dir2 AND camino_fantasma(x,y,dir2))
  659.                 RETURN(dir2);
  660.             END
  661.         END
  662.         // Si no devuelve la posición en la que sea posible avanzar
  663.         IF (camino_fantasma(x,y,dir1) AND old_dir<>(dir1 XOR 1))
  664.             contador0=dir1;
  665.         ELSE
  666.             IF (camino_fantasma(x,y,dir2) AND old_dir<>(dir2 XOR 1))
  667.                 contador0=dir2;
  668.             END
  669.         END
  670.     END
  671.     RETURN(contador0);
  672. END
  673.  
  674. //------------------------------------------------------------------------------
  675. // Proceso cuenta_dir
  676. // Cuenta las posibles direcciones del fantasmas
  677. //------------------------------------------------------------------------------
  678.  
  679. PROCESS cuenta_dir(x,y)
  680.  
  681. PRIVATE
  682.     dir=0;          // Numero de direcciones
  683.     contador0=0;    // Contador de uso general
  684.  
  685. BEGIN
  686.     REPEAT          // Va mirando por todas la direcciones
  687.         // Si el camino es posible incrementa el contador
  688.         IF (camino_fantasma(x,y,contador0))
  689.             dir++;  // Contando salidas
  690.         END
  691.     UNTIL (contador0++==3)
  692.     RETURN(dir);    // Devuelve el número de direcciones posibles
  693. END
  694.  
  695. //------------------------------------------------------------------------------
  696. // Proceso ojos
  697. // Maneja los ojos de los fantasmas ( cuando son comidos)
  698. //------------------------------------------------------------------------------
  699.  
  700. PROCESS ojos(x,y,modelo)
  701.  
  702. PRIVATE
  703.     imagen;  // Numero de gráfico
  704.  
  705. BEGIN
  706.     LOOP
  707.         // Comprueba los lados de la pantalla
  708.         IF (x<105) x=105; END
  709.         IF (x>554) x=554; END
  710.  
  711.         // Selecciona la dirección y el gráfico de acuerdo al color del mapa de caminos
  712.         SWITCH (map_get_pixel(0,33,(x-105)/2,(y-1)/2))
  713.             CASE 14: x-=2; graph=29; END
  714.             CASE 10: x+=2; graph=30; END
  715.             CASE 12: y+=2; graph=31; END
  716.             CASE 9:  y-=2; graph=32; END
  717.             // Si es el color 11 es que ha llegado a casa, quita los ojos y pone un fantasma
  718.             CASE 11: imagen=0; signal(id,s_kill); fantasma(x,y,modelo); END
  719.         END
  720.         // Solo muestra los gráficos cada cuatro imagens
  721.         IF ((imagen AND 3)==0) FRAME; END
  722.         imagen++;
  723.     END
  724. END
  725.  
  726. //------------------------------------------------------------------------------
  727. // Proceso vida
  728. // Imprime las vidas del marcador
  729. //------------------------------------------------------------------------------
  730.  
  731. PROCESS vida(x)
  732.  
  733. BEGIN
  734.     y=14;       // Elige la coordenada vertical
  735.     graph=4;    // Selecciona gráfico
  736.     LOOP
  737.         FRAME;
  738.     END
  739. END
  740.  
  741. //------------------------------------------------------------------------------
  742. // Proceso parpadeante
  743. // Imprime los puntos grandes
  744. //------------------------------------------------------------------------------
  745.  
  746. PROCESS parpadeante(x,y)
  747.  
  748. BEGIN
  749.     z=10;
  750.     LOOP
  751.         graph=10;   // Imprime el gráfico
  752.         FRAME(300); // Espera
  753.         graph=0;    // No pone ningún gráfico
  754.         FRAME(300); // Espera
  755.     END
  756. END
  757.  
  758. //------------------------------------------------------------------------------
  759. // Proceso fruta
  760. // Maneja las frutas
  761. //------------------------------------------------------------------------------
  762.  
  763. PROCESS fruta()
  764.  
  765. PRIVATE
  766.     tiempofruta=100;        // Contador de tiempo
  767.  
  768. BEGIN
  769.     x=320;                  // Asigna las coordenadas y el gráfico
  770.     y=270;
  771.     graph=g_frutas[nivel];
  772.     z=10;                   // Selecciona el gráfico
  773.  
  774.     // Repite hasta que tiempofruto sea 0
  775.     WHILE (tiempofruta>0)
  776.         tiempofruta--;      // Decrementa tiempo de fruta
  777.         // Fruta comida
  778.         IF (collision(TYPE paco))
  779.             sound(s_come_fruta,512,256);        // Hace el sonido
  780.             tiempofruta=-20;                    // Pone otra pausa
  781.             puntuacion+=valor_frutas[nivel];    // Suma puntuación
  782.             graph=g_valor_frutas[nivel];        // Pon gráfico con puntos
  783.         END
  784.         FRAME;
  785.     END
  786.  
  787.     // Espera el valor que se puso negativo en tiempofruta
  788.     WHILE (tiempofruta<0)
  789.         tiempofruta++;
  790.         FRAME;
  791.     END
  792. END
  793.  
  794. //------------------------------------------------------------------------------
  795. // Proceso titulo
  796. // Imprime y mueve los texto
  797. //------------------------------------------------------------------------------
  798.  
  799. PROCESS titulo(txt)
  800.  
  801. PRIVATE
  802.     // Coordenadas verticales de titulo
  803.     tabla_grafico[]=50,52,53,54,54,53,52,50,48,47,46,46,47,48;
  804.     contador0=0;    // Contador de uso general
  805.  
  806. BEGIN
  807.     graph=47;       // Selecciona gráfico de titulo
  808.     x=320;          // Pone coordenada horizontal
  809.     z=-10;
  810.     LOOP
  811.         contador0=(contador0+1) MOD 14;
  812.  
  813.         // Imprímelo dentro de pantalla
  814.         IF (contador0==0) move_text(txt,320,320); END
  815.  
  816.         // Imprímelo fuera de pantalla lo que hace al texto intermitente
  817.         IF (contador0==7) move_text(txt,320,640); END
  818.         // Mueve el titulo
  819.         y=tabla_grafico[contador0];    // Mueve el titulo
  820.         FRAME;
  821.     END
  822. END
  823.  
  824. //------------------------------------------------------------------------------
  825. // Proceso inicio_juego
  826. // Reinicializa el juego
  827. //------------------------------------------------------------------------------
  828.  
  829. PROCESS inicio_juego()
  830.  
  831. PRIVATE
  832.     texto1;     // Identificadores de texto
  833.     texto2;
  834.     texto3;
  835.     contador0;  // Contador de carácter general
  836.  
  837. BEGIN
  838.  
  839.     // Para cualquier sonido que estuviera sonando
  840.     stop_sound(all_sound);
  841.     fade_on();  // Encender la pantalla
  842.  
  843.     // Inicia el sonido de entrada e imprime los texto necesarios
  844.     sound(s_empieza,512,256);
  845.     texto1=write(1,320,243,1,"!Preparado!");
  846.     texto2=write(1,300,152,1,"Nivel");
  847.     texto3=write_int(1,376,152,1,&nivel);
  848.  
  849.     FRAME(9000);        // Espera
  850.  
  851.     // Borra los textos
  852.     delete_text(texto1);
  853.     delete_text(texto2);
  854.     delete_text(texto3);
  855.  
  856.     // Crea a pacoman y a los fantasma
  857.     paco();
  858.     fantasma(320,177,12);
  859.     fantasma(290,223,16);
  860.     fantasma(320,223,20);
  861.     fantasma(352,223,24);
  862. END
  863.